﻿#ifndef DAOCLOUDS_H
#define DAOCLOUDS_H
#include "src/middle/structs/cloudmodels.h"
#include <QList>

// Transport progress callback
using TransProgressCallback = std::function<
        void(uint64_t transferred_size, uint64_t total_size, void*)>;

/// @brief 对象存储 DAO (基类)
///
/// 它与对象存储云服务互联, 并提供访问和修改数据的接口.
/// 这是一个基类, 具体的云供应商(如腾讯云和阿里云等)
/// 应该派生出它们自己的类.
///
/// 它支持:
///     1. 登录到后端服务器
///     2. 获取存储桶列表
///     3. 创建/删除存储桶
///     4. 获取对象列表
///     5. 上传/下载对象等
class DaoClouds
{
public:
    DaoClouds() {}

    virtual QList<MyBucket> login(
            const QString& secretId,
            const QString& secretKey) = 0;

    virtual QList<MyBucket> buckets() = 0;

    virtual bool isBucketExists(const QString& bucketName) = 0;

    virtual QString getBucketLocation(const QString& bucketName) = 0;

    virtual void putBucket(
            const QString& bucketName,
            const QString& location) = 0;

    virtual void deleteBucket(const QString& bucketName) = 0;

    virtual QList<MyObject> getObjects(
            const QString& bucketName,
            const QString& dir) = 0;

    virtual void putObject(
            const QString& bucketName,
            const QString& key,
            const QString& localPath,
            const TransProgressCallback& callback) = 0;

    virtual void getObject(
            const QString& bucketName,
            const QString& key,
            const QString& localPath,
            const TransProgressCallback& callback) = 0;
};

#endif // DAOCLOUDS_H
